import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import plotly.express as px
import kaleido #用于保存图像
df=pd.read_csv("H:\VS Code\深圳一手商品房数据处理\更新后的数据集1.0.csv")
'''print(df.head())#显示前五行，查看数据
print(df.info())#查看数据类型
print(df.describe())#查看数据描述'''
#按区计算月均成交套数（滚动30天平均）
df['月均成交']=df.groupby('所属区')['成交套数'].transform(lambda x: x.rolling(30,min_periods=1).mean())
#去化周期 = 可售套数 / 月均成交
df['去化周期']=df['可售套数']/df['月均成交']
#异常值修正（去化周期大于1500和小于250的值）
df=df[(df['去化周期']<=1500)&(df['去化周期']>=250)]
print(df[['所属区','去化周期']].head(20))#查看去化周期
df_clean=df[['所属区','成交套数','成交均价','可售套数','去化周期']].copy()#复制数据
df_clean.to_csv("H:\VS Code\深圳一手商品房数据处理\去化周期.csv",index=False)


##健康等级的定义
#根据去化周期划分市场状态
condition= [
    (df['去化周期']<=500),
    (df['去化周期']>500) & (df['去化周期']<=800),
    (df['去化周期']>800) & (df['去化周期']<=1500)
]
choice=['紧缺','健康','过剩']
df['健康等级'] = np.select(condition, choice)
print(df.head(10))#查看健康等级
df.to_csv("H:\VS Code\深圳一手商品房数据处理\更新后的数据集2.0.csv",index=False)#保存数据
#区域健康可视化
#生成各行政区健康度分布柱状图
health_dist=df.groupby(['所属区','健康等级']).size().reset_index(name='数量')
print(health_dist.head)

#利用matplotlib绘制各行政区健康等级分布柱状图
'''
plt.figure(figsize=(12,6))
plt.bar(health_dist['所属区'], health_dist['数量'])
plt.title('深圳')
plt.xlabel('行政区')
plt.ylabel('数量')'''

#利用plotly库绘制各行政区健康等级分布柱状图(交互式)
fig=px.bar(health_dist, x='所属区', y='数量', color='健康等级', barmode='group',title='深圳各行政区健康等级分布')
fig.update_layout(xaxis_title='行政区', yaxis_title='数量')
#生成图像并保存到本地
fig.show()
#plt.show()
